package com.im

import java.io.ObjectInputStream
import java.io.ObjectOutputStream
import java.net.Socket

// 客户端
class Client: Thread {
    private lateinit var mReceiver: ObjectInputStream   // 数据接收者
    private lateinit var mSender: ObjectOutputStream    // 数据发送者
    private val mServer: Server                         // 服务器
    private val mSocket: Socket                         // 客户端套接字

    /**
     * 构造方法。
     * @param mServer   服务器
     * @param mSocket   客户端套接字
     */
    constructor(server: Server, socket: Socket) {
        mServer = server
        mSocket = socket
        try {
            mReceiver = ObjectInputStream(mSocket.getInputStream())
            mSender = ObjectOutputStream(mSocket.getOutputStream())
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

    /**
     * 接收数据的线程方法。
     */
    override fun run() {
        while (mSocket.isConnected) {
            try {
                // 接收数据并转换成协议
                val pro: ImProtocol = mReceiver.readObject() as ImProtocol

                // 处理协议
                mServer.onGetMessageFromClient(pro, this)
            } catch (e: Exception) {
                break
            }
        }

        try {
            mReceiver.close()
            mSender.close()
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

    /**
     * 发送数据。
     * @param pro   协议
     */
    fun sendData(pro: ImProtocol) {
        if (mSocket.isClosed) {
            return
        }

        try {
            mSender.writeObject(pro)

            // 防止发送过快导致客户端无法响应
            sleep(100)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
}
